home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Tools
/
HRTmon
/
src
/
copper.s
< prev
next >
Wrap
Text File
|
1999-11-06
|
5KB
|
261 lines
;HRTmon Amiga system monitor
;Copyright (C) 1991-1998 Alain Malek Alain.Malek@cryogen.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You can find the full GNU GPL online at: http://www.gnu.org
;-------------- Search copper-list -----------------------------
cmd_cop moveq #0,d5
move.l max_chip,d6
bsr evaluate
bmi.w illegal_addr
bgt.w .norange
move.l d0,d5
and.w #$fffe,d5
bsr evaluate
bmi.w illegal_addr
bgt.w .norange
move.l d0,d6
and.w #$fffe,d6
.norange cmp.l d5,d6
bls.w illegal_addr
move.l d5,a0
move.l d6,a1
bsr search_cop
tst.l d7
beq.b .cop
lea.l copfailed_txt(pc),a0
bsr print
bra.b .out
.cop lea.l copfound_txt(pc),a0
bsr print
moveq #8,d1
move.l custom+$80,d0
bsr print_hexCR
.out bra.w end_command
copfailed_txt dc.b "Couldn't find copper-list",$a,0
copfound_txt dc.b "Copper-list found at $",0
even
;-> a0-a1 = search range
;<- d0 = copper address
;<- d7 = success / failed
search_cop movem.l d1/a2,-(a7)
bsr remove_pic
move.w #$8380,$dff096
move.w #$2700,sr
moveq #-1,d7
moveq #-2,d1
.seek cmp.l a1,a0
bge.w .end
cmp.l (a0),d1
beq.b .try
addq.l #2,a0
bra.b .seek
.try
move.l a0,a2
addq.l #2,a0
subq.l #4,a2
bsr .test_cop
beq.b .seek
.up cmp.l #$200,a2
blt.b .down
lea.l -$200(a2),a2
bsr .test_cop
bne.b .up
.down lea.l $20(a2),a2
bsr .test_cop
beq.b .down
.up2 subq.l #4,a2
bsr .test_cop
bne.b .up2
addq.l #4,a2
moveq #0,d7
move.l a2,d0
move.l d0,custom+$80
.end move.l d0,-(a7)
moveq #0,d0
jsr analyse_copper
move.l (a7)+,d0
bsr set_pic
move.w #$80,$dff096
move.w #$2000,sr
movem.l (a7)+,d1/a2
rts
.test_cop movem.l d0/d6,-(a7)
move.w (a2),d0
btst #0,d0
beq.b .move
cmp.b #$f0,d0
bhi.b .nocop
bra.b .okwait
.move tst.w d0
beq.b .nocop
cmp.w #$1fe,d0
bls.b .okwait
.nocop moveq #0,d0
bra.b .exittest
.okwait move.w #$10,$dff09c
move.l (a2),d6
move.l #$009c8010,(a2)
move.w #$0,$dff088
move.b #0,$bfe801
.wait cmp.b #2,$bfe801
bls.b .wait
move.w $dff01e,d0
move.l d6,(a2)
and.w #$10,d0
.exittest movem.l (a7)+,d0/d6
rts
;----------------------------------------------------------
;-------------- analyse the actual copper-list and --------
;-------------- update custom registers -------------------
;-> d0=pic_no (stop the scan after the d0th write to $DFF100, 0=scan all)
analyse_copper movem.l d0-a4,-(a7)
move.w d0,d6
bne.b .okpara
moveq #-1,d6
.okpara lea.l custom,a3
move.l $80(a3),d0 ;get copper 1 start
bsr.b .analyse
movem.l (a7)+,d0-a4
rts
;-> d0=ptr on copper-list
.analyse lea.l custom,a3
lea.l paletteH-$180,a1
move.w ($106,a3),d3
btst #9,d3 ;low or high bits palette
beq.b .high
lea.l paletteL-$180,a1
.high rol.w #3,d3
and.w #%111,d3 ;d1=bank no.
lsl.w #6,d3 ;*32*2
add.w d3,a1
lea.l move_list,a2
btst #0,d0
bne.w .end ;copper list at odd address ?
move.l d0,a0
.loop move.l a0,a4
bsr corr_addr
movem.w (a4)+,d0/d1 ;read actual instr.
addq.l #4,a0 ;go next instr.
btst #0,d0 ;wait/skip or move instr. ?
bne.b .waitinst
cmp.w #$200,d0 ;legal custom register ?
bcc.w .end
cmp.w #$88,d0 ;cop1jmp ?
bne.b .nojmp1
move.l ($80,a3),a0 ;do the jmp to cop1
bra.b .loop
.nojmp1 cmp.w #$8a,d0 ;cop2jmp ?
bne.b .nojmp2
move.l ($84,a3),a0 ;do the jmp to cop2
bra.b .loop
.nojmp2 cmp.w #$180,d0
blt.b .nocolor
cmp.w #$1be,d0
bgt.b .nocolor
move.w d1,(a1,d0.w) ;copy in actual palette bank
.nocolor cmp.w #$106,d0
bne.b .nobplcon3
lea.l paletteH-$180,a1
move.w d1,d3
btst #9,d3 ;low or high bits palette
beq.b .high2
lea.l paletteL-$180,a1
.high2 rol.w #3,d3
and.w #%111,d3 ;d1=bank no.
lsl.w #6,d3 ;*32*2
add.w d3,a1
.nobplcon3 move.w d0,d2
lsr.w #1,d2
tst.b (a2,d2.w) ;do I need to copy this value ?
beq.b .nocopy
move.w d1,(a3,d0.w) ;copy in custom
cmp.w #$100,d0
bne.b .no100
subq.w #1,d6 ;dec(pic_no)
beq.b .end
.no100 bra.b .nocopy
.waitinst cmp.w #$ffff,d0
beq.b .end
.nocopy bra.w .loop
.end rts
cnop 0,4
;-------------- flags signaling registers to copy ---------
;-------------- from copper-list to custom ----------------
move_list dcb.b $40,0 ;$000-$07e
dc.b -1,-1 ;$80,$82 ;cop1
dc.b -1,-1 ;$84,$86 ;cop2
dc.b 0,0,0 ;$88,$8a,$8c
dc.b -1,-1,-1,-1 ;$8e,$90,$92,$94
dcb.b $25,0 ;$96-$de
dcb.b $10,-1 ;$e0-$fe
dcb.b 7,-1 ;$100-$10c
dcb.b 9,0 ;$10e-$11e
dcb.b $10,-1 ;$120-$13e
dcb.b $20,0 ;$140-$17e
dcb.b $20,-1 ;$180-$1be
dcb.b $d,0 ;$1c0-$1d8
dc.b 0 ;$1da
dc.b -1 ;$1dc
dc.b -1,-1,-1 ;$1de-$1e2
dc.b -1 ;$1e4
dcb.b $b,0 ;$1e6-$1fa
dc.b -1 ;$1fc
dc.b 0 ;$1fe
move_end